package it.pir.es05ChatTCP_TLS;

import java.io.*;
import java.net.*;
import java.util.HashMap;
import java.util.Map;

import javax.net.ServerSocketFactory;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;

public abstract class Server {

	private static final int PORT = 7777;

	protected Map<String,OutputStream> clients;
	protected ServerSocket serverSocket;
	protected ChatWindow chat;

	public Server(int port) throws IOException {
		clients = new HashMap<String,OutputStream>();
		
		//TODO modificare il path
		//Setto le proprietà per collegare il keystore e il truststore al server
		// i file che si creano vanno nella cartella bin del progetto, cioè dove sono gli eseguibili
		System.setProperty("javax.net.ssl.keyStore", "keystore.jks");
		System.setProperty("javax.net.ssl.keyStorePassword", "pirchattls");
		System.setProperty("javax.net.ssl.trustStore","truststore.jks");
		System.setProperty("javax.net.ssl.trustStorePassword","pirchattls");
		
		
		//Richiamo il metodo per la creazione della socket
		serverSocket = createServerSocket(port);
		
		//creo una window per la chat
		chat = new ChatWindow();
        chat.setVisible(true);
        chat.setSize(800, 600);
	}
	
	public static ServerSocket createServerSocket(int port) throws IOException {
	
		//creazione di una factory per la socket server
       ServerSocketFactory factory=SSLServerSocketFactory.getDefault();
       
       //creazione della ServerSocket di tipo SSL
       SSLServerSocket sock=(SSLServerSocket) factory.createServerSocket(port);
       
       //imponiamo che oltre al server anche il client dev'essere autenticato
       sock.setNeedClientAuth(true);
       
       
       return sock;
	}
	
	public void addClient(String nickname, OutputStream clientObjectOutputStream) {
		clients.put(nickname, clientObjectOutputStream);
	}
	
	public void removeClient(String nickname) {
		clients.remove(nickname);
	}
	
	public abstract void broadcastSend(String nickname, Message message) throws IOException;
	
	public abstract void start();

	public static void main(String[] args) throws IOException {
		// TODO: qui si cambiano le implementazioni
		Server server = new ServerObj(PORT);
		//Server server = new ServerBin(PORT);
		//Server server = new ServerTxt(PORT);
		server.start();
	}

}
